home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / trojka.tgz / trojka.tar / trojka / hiscore.c < prev    next >
C/C++ Source or Header  |  1994-02-25  |  2KB  |  128 lines

  1. /*
  2.  *    @(#) hiscore.c -- hiscore system for TROJKA
  3.  *    created:    4.iii.1992
  4.  *    modified:     13.iii.1992
  5.  */
  6.  
  7. #include "sys_custom.h"
  8. #include "hiscore.h"
  9. #include "trojka.h"
  10.  
  11. #include <stdio.h>
  12. #include <fcntl.h>
  13.  
  14. int     gameover(),
  15.     shiftscores(),
  16.     readscores(),
  17.     writescores(),
  18.     scorelist();
  19.  
  20. extern struct scorefile *sfile;
  21.  
  22. extern unsigned long
  23.     score,
  24.     wipes,
  25.     blocks;        /* trojka */
  26.  
  27. extern int
  28.     speed;
  29.  
  30. extern int  position;
  31.  
  32. int gameover()
  33. {
  34.     struct scorefile *i, *a, *eof;
  35.  
  36.     showscore();
  37.  
  38.     showgameover();
  39.  
  40.     eof = &sfile[NUMSCORES];
  41.     position = NUMSCORES+1; /* initially no position in hiscore table */
  42.     a = &sfile[0];
  43.     while (a < eof) {
  44.         if (score > a->points) {
  45.             position = (a-sfile)+1;
  46.             break;
  47.         }
  48.         a++;
  49.     }
  50.     /* open up score list */
  51.  
  52.     eof--;
  53.     i = eof;
  54.     while(eof > a)
  55.         *(i--) = *(--eof);
  56.  
  57.     if (position < NUMSCORES) {        /* YOU ARE IN THE LIST */
  58.         a->points = score;
  59.         a->stage  = speed;
  60.         while(getname(a->name)==0)    /* empty name not allowed */
  61.             ;
  62.         writescores();        /* write scores to disk */
  63.     }
  64. }
  65.  
  66. int readscores()
  67. {
  68.     int fd, old_umask;
  69.     struct scorefile *eof, *i;
  70.  
  71.     eof = &sfile[NUMSCORES];
  72.     
  73.     for(i = sfile; i < eof; i++) {    /* Assume default scores */
  74.         strcpy(i->name, STDNAME);
  75.         i->points = 333;
  76.         i->stage = STDLEVEL;
  77.     }
  78.     fd = open(SCOREFILE, O_RDONLY);
  79.     if(fd == -1) {        /* if there's no highscore file -> create one */
  80.         old_umask = umask(0);
  81.         fd = creat(SCOREFILE, UMASK);
  82.         umask(old_umask);
  83.         if(fd == -1)
  84.             quit_prog("Error creating scorefile");
  85.         close(fd);
  86.         writescores();    /* write the default scores */
  87.         if((fd = open(SCOREFILE, O_RDWR)) == -1)
  88.             quit_prog("Error opening scorefile");
  89.     }
  90.     if(read(fd,sfile, FILE_SIZE) == -1)
  91.         quit_prog("Error reading scorefile");
  92.     close(fd);
  93. }
  94.  
  95. int writescores()
  96. {
  97.     int fd;
  98.  
  99.     sfile = &sfile[0];
  100.     if((fd = open(SCOREFILE, O_WRONLY)) == -1)
  101.         quit_prog("Error opening scorefile.");
  102.     
  103.     if((write(fd, sfile, FILE_SIZE)) == -1) 
  104.         quit_prog("Score-file write error.");
  105.  
  106.     if((close(fd)) == -1)
  107.         quit_prog("Error closing scorefile.");
  108. }
  109.  
  110.  
  111. int scorelist()
  112. {        /* used for the -s option */
  113.     struct scorefile *eof, *i;
  114.  
  115.     readscores();
  116.     eof = &sfile[NUMSCORES-1];
  117.  
  118.     fprintf(stderr,"\nBest Trojka-Czars\n-----------------\n\n");
  119.  
  120.     for(i=sfile; i<eof; i++) 
  121.         fprintf(stderr,"%-22s %7lu %3d\n",
  122.             i->name,
  123.             i->points,
  124.             i->stage
  125.         );
  126.     fprintf(stderr,"\n\n");
  127. }
  128.